Jedes Objekt besitzt die Eigenschaften und Methoden, die seine Klasse zur Verfügung stellt. Alle Instanzen einer Klasse besitzen also dieselben Eigenschaften und Methoden. Sie unterscheiden sich nur durch die verschiedenen Eigenschaftswerte. Um die unterschiedlichen Zustände speichern zu können, benötigt jede Instanz ihre eigene Menge an Instanzvariablen.
Der Programmcode der Methoden dagegen ist in jeder Instanz derselbe. Es ist nicht nötig, dass jede Instanz eine Kopie des Codes besitzt. Statt dessen können alle Instanzen den Code der Klasse verwenden. Wenn man viele Instanzen einer Klasse erstellt, spart man so Speicherplatz. Wenn aber alle Instanzen denselben Programmcode verwenden, wie kann dann der Programmcode 'wissen' mit welchen Eigenschaftsvariablen er arbeiten soll? Das folgende Bild veranschaulicht dieses Problem:
Die Lösung liegt darin, dass jedes Objekt eine schreibgeschützte Eigenschaft Me besitzt, in der es einen Verweis auf sich selber speichert. Der Verweis wird jeder Methode bei der Ausführung implizit übergeben. Die Methode kann damit die aufrufende Instanz jederzeit identifizieren. Das nächste Bild veranschaulicht dies:
Die Eigenschaft Me wird als die Identität eines Objekts bezeichnet. Die Identität ist eine Eigenschaft, die jedes Objekt besitzt, und die jedes Objekt von allen anderen unterscheidet. Selbst wenn ein Objekt eine Kopie eines anderen ist, unterscheiden sich die beiden Objekte immer durch ihre Identität.
Da die Eigenschaft Me implizit verwendet wird, begegnet man ihr selten. Ein Beispiel, in dem sie explizit eingesetzt wird, ist der sogenannte Callback-Mechanismus. Von Callback spricht man, wenn der Empfänger eines Ereignisses dem Absender eine Meldung zurück sendet. Der Sender muss in diesem Fall dem Empfänger seine Identität als Parameter der Meldung mitteilen.
Die nachfolgenden Programmzeilen skizzieren die Implementation eines Callback-Mechanismus in VBA. Objekte vom Typ cSender fungieren dabei als Sender, Objekte vom Typ cEmpfänger als Empfänger. Der Aufruf der Methode Frage entspricht dem Verschicken einer Meldung an das Empfänger-Objekt. Der Aufruf der Methode Antwort entspricht dem zurückschicken einer Meldung an den Absender.
Klassenmodul cSender
Public Sub Operation() ... Empfänger.Frage Me 'Frage senden ... End Sub Public Sub Antwort(...) 'Antwort empfangen ... End Sub
Klassenmodul cEmpfänger
Public Sub Frage(Absender As Object) 'Frage empfangen ... Absender.Antwort ... 'Antwort zurücksenden ... End Sub